iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
Kubernetes

成為 Kubernetes 特級咒術師的 30 天修行系列 第 19

第十九篇:容器化與 Kubernetes 的部署

  • 分享至 

  • xImage
  •  

前言

在我們進行部署之前,,為了要能夠透過 API 進行使用,所以我們又加上了 Python Flask 作為我們的框架,Flask 是一個輕量級的 Web 應用程式框架,能夠提供我們簡易的 RESTful API 進行操作。
(這部分很簡單,而且也不是我們的重點,所以我們就一一不贅述囉~)

而在完成後,我們就要將我們的 RAG 問答系統進行 Kubernets 的部署啦!
但在這之前我們需要將我們的程式包成正確的 image,才能進行部署~

Dockerfile

什麼是 Dockerfile?

Dockerfile 是一個文本檔案,包含了一系列指令(commands),這些指令告訴 Docker 如何構建一個 Docker Image。透過這些指令,我們可以指定基礎映像、安裝所需的軟體、設定環境變數、複製應用程式的程式碼、以及定義應用程式的啟動方式等。

以下就是我們的 Dockerfile 的內容:

FROM python:3.10-slim

# Setup Ollama
RUN apt-get update && apt-get install curl -y
RUN curl -fsSL https://ollama.com/install.sh | sh

# 安裝 Ollama
RUN bash -c "ollama serve &"

# 拉取所需的模型
RUN ollama pull gemma2

WORKDIR /src

# 複製應用程式檔案
COPY llm.py /src/llm/llm.py
COPY requirements.txt /src/llm/requirements.txt
COPY entrypoint.sh /src/entrypoint.sh

# 安裝 Python 依賴
RUN pip install -r /src/llm/requirements.txt

# 賦予啟動腳本執行權限
RUN chmod +x /src/entrypoint.sh

# 暴露應用程式 port
EXPOSE 5000

# 使用啟動腳本作為容器入口點
ENTRYPOINT ["/src/entrypoint.sh"]

而由於我們要同時啟動 Ollama 服務和 Flask 應用程式,所以我有在建立一個 Shell Script 檔來進行啟動:

#!/bin/bash

# 啟動 Ollama 服務
ollama serve &

# 等待 Ollama 服務啟動
sleep 5

# 啟動 Flask 應用程式
exec python /src/llm/llm.py

在我們完成 Dockerfile 的撰寫後,就可以用 docker build 的指令將映像檔建立起來,並且再透過 docker push 將我們的 image push 到我們自己的 Docker Hub。
(如果還想知道更多 Docker 相關內容,可以看 Docker 官方文件

docker build -t demo/image-name:v1 .
docker push demo/image-name:v1

接下來我們就可以進行我們 Kubernetes 的部署啦!

Kubernetes 的部署

我是在 Ubuntu 22.04 的環境下,在 Kubernetes v1.28.11 上創建 Deployment 與 Service 來進行部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: llm-deployment
  labels:
    app: llm-app
spec:
  replicas: 3  # 可以根據需要調整副本數量
  selector:
    matchLabels:
      app: llm-app
  template:
    metadata:
      labels:
        app: llm-app
    spec:
      containers:
      - name: llm-container
        image: demo/image-name:v1  # 替換為自己的 Docker Image
        ports:
        - containerPort: 5000
        
---

apiVersion: v1
kind: Service
metadata:
  name: llm-service
spec:
  type: NodePort 
  selector:
    app: llm-app
  ports:
    - protocol: TCP
      port: 80          # 外部訪問的 port
      targetPort: 5000  # 容器內部應用運行的 port

最後再進行部署:

kubectl apply -f llm-deployment.yaml
kubectl apply -f llm-service.yaml

這樣就完成 Kubernetes 的部署啦!
我們可以自己透過打 API 的方式進行詢問囉~


上一篇
第十八篇:LangChain 的使用與 RAG 的結果
下一篇
第二十篇:RAG 的限制
系列文
成為 Kubernetes 特級咒術師的 30 天修行30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言